package com.ang.normal.helloword;

import com.ang.normal.RabbitMqUtils;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author ssang
 * @date 2022-04-09 10:25
 *
 * 1.channel.queueDeclare("hello",true,false,false,null);
 *  如果hello不存在会自动创建
 *
 * 2.channel.basicConsume("hello",true, defaultConsumer);
*   开始消费的时候，如果hello这个队列不存在，会报错
 *
 * 3.如果有多个Consumer消费同一个队列，会轮询平均的发送给每一个消费者。为了让消费快的多消费，可以进行一下设置：
 *  1）设置通道每次只消费一条消息
 *      channel.basicQos(1);
 *  2）关闭消息的自动确认，手动去确认消息
 *      channel.basicAck(envelope.getDeliveryTag(),false);
 */
public class Consumer {
    public static void main(String[] args) throws Exception{
        Connection connection = RabbitMqUtils.getRabbitMqConnection();

        Channel channel = connection.createChannel();

        //通道关联队列，参数和生产者保持一致
        //注意：如果hello不存在，会自动创建一个hello队列
        //channel.basicQos(1);
        channel.queueDeclare("hello2",true,false,false,null);

        //创建默认消费者处理消息
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            //获取消息并且处理。此方法类似于事件监听，有消息时会被自动调用
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("message:"+new String(body));  //body即消息体
            }
        };

        //消费消息
        //注意：开始消费的时候，如果hello这个队列不存在，会报错
        //参数：队列名称；是否开启自动确认机制；消费消息的回调
        channel.basicConsume("hello2",true, defaultConsumer);
    }
}
